<?php

/**
 * PhalApi_Cookie COOKIE操作
 *
 * - 原生态COOKIE操作的简单封装
 * - 注意，设置的COOKIE需要在下一次才能生效
 *
 * <br>使用示例：<br>
 * ```
 *  //COOKIE
 *  DI()->cookie = 'PhalApi_Cookie';
 *
 *  //设置COOKIE服务
 *  DI()->cookie->set('name', 'phalapi', $_SERVER['REQUEST_TIME'] + 600);
 *
 *  //获取
 *  echo DI()->cookie->get('name');  //输出 phalapi
 *
 *  //删除
 *  DI()->cookie->delete('name');
 *
 * ```
 * @package PhalApi\Cookie
 * @license http://www.phalapi.net/license GPL 协议
 * @link http://www.phalapi.net/
 * @author dogstar <chanzonghuang@gmail.com> 2015-04-11
 */
class PhalApi_Cookie {

    /**
     * COOKIE配置
     */
    protected $config = [];

    /**
     * @param string $config ['path'] 路径
     * @param string $config ['domain'] 域名
     * @param boolean $config ['secure'] 是否加密
     * @param boolean $config ['httponly'] 是否只HTTP协议
     * @link http://php.net/manual/zh/function.setcookie.php
     */
    public function __construct($config = []) {
        $this->config['path'] = isset($config['path']) ? $config['path'] : NULL;
        $this->config['domain'] = isset($config['domain']) ? $config['domain'] : NULL;
        $this->config['secure'] = isset($config['secure']) ? $config['secure'] : FALSE;
        $this->config['httponly'] = isset($config['httponly']) ? $config['httponly'] : FALSE;
    }

    /**
     * 获取COOKIE
     *
     * @param string $name 待获取的COOKIE名字
     * @return string/NULL/array $name为NULL时返回整个$_COOKIE，存在时返回COOKIE，否则返回NULL
     */
    public function get($name = NULL) {
        if ($name === NULL) {
            return $_COOKIE;
        }

        return isset($_COOKIE[$name]) ? $_COOKIE[$name] : NULL;
    }

    /**
     * 设置COOKIE
     *
     * @param string $name 待设置的COOKIE名字
     * @param string /int $value 建议COOKIE值为一些简单的字符串或数字，不推荐存放敏感数据
     * @param int $expire 有效期的timestamp，为NULL时默认存放一个月
     * @param boolean
     */
    public function set($name, $value, $expire = NULL) {
        if ($expire === NULL) {
            $expire = $_SERVER['REQUEST_TIME'] + 2592000;   //a month
        }

        return setcookie(
            $name,
            $value,
            $expire,
            $this->config['path'],
            $this->config['domain'],
            $this->config['secure'],
            $this->config['httponly']
        );
    }

    /**
     * 删除COOKIE
     *
     * @param strint $name 待删除的COOKIE名字
     * @param boolean
     * @see PhalApi_Cookie::set()
     */
    public function delete($name) {
        return $this->set($name, '', 0);
    }

    /**
     * 获取COOKIE的配置
     */
    public function getConfig() {
        return $this->config;
    }
}
